package com.test.antlr4.sql.util;

import com.test.antlr4.sql.core.SQLLexer;
import com.test.antlr4.sql.core.SQLParser;
import org.antlr.v4.runtime.ANTLRInputStream;
import org.antlr.v4.runtime.BaseErrorListener;
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.TokenStream;
import org.antlr.v4.runtime.tree.ParseTree;
import org.apache.commons.lang3.StringUtils;

/**
 * Antlr4 处理工具类
 *
 * @author leijingshuo 2020/10/25
 */
public class Antlr4Util {
    /**
     * 获取Antlr4 Token流
     *
     * @param exp 表达式
     * @return TokenStream
     */
    public static TokenStream getTokenStream(String exp) {
        if (StringUtils.isBlank(exp)) {
            throw new RuntimeException("exp表达式不能为空！");
        }
        // 新建一个CharStream，读取数据
        ANTLRInputStream input = new ANTLRInputStream(exp);
        // 新建一个词法分析器，处理输入的字符流input
        SQLLexer lexer = new SQLLexer(input);
        // 新建一个词法符号的缓冲区，用于存储词法分析器生成的词法符号（Token）
        return new CommonTokenStream(lexer);
    }

    /**
     * 获取Antlr4 语法分析树
     *
     * @param exp 表达式
     * @return ParseTree
     */
    public static ParseTree getParseTree(String exp) {
        TokenStream tokenStream = getTokenStream(exp);
        // 新建一个语法分析器，用于分析词法符号缓冲区中的词法符号
        SQLParser parser = new SQLParser(tokenStream);
        //parser.removeErrorListeners();
        //设置语法错误监听器
        //parser.addErrorListener(ERROR_LISTENER);
        //对assign规则进行语法分析，生成语法分析树
        return parser.column_name();
    }
}
